import logging
import sys
import os
import sqlite3
from pathlib import Path

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# 配置详细日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 直接使用SQLite进行清理，绕过ORM的复杂性
def clear_all_test_data():
    """使用原生SQLite直接清空所有测试数据"""
    # 获取数据库文件路径
    db_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "database.db")
    logger.info(f"使用数据库文件: {db_path}")
    
    # 检查数据库文件是否存在
    if not os.path.exists(db_path):
        logger.error(f"数据库文件不存在: {db_path}")
        return False
    
    try:
        # 连接到SQLite数据库
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        logger.info("成功连接到数据库")
        
        # 禁用外键约束以避免删除顺序问题
        cursor.execute("PRAGMA foreign_keys = OFF")
        conn.commit()
        logger.info("已禁用外键约束，开始清理所有测试数据")
        
        # 获取所有表的当前数据量统计 - 使用引号包装特殊表名
        tables_to_clear = [
            ("orders", "orders"), 
            ("production_jobs", "production_jobs"), 
            ("shopify_sync_logs", "shopify_sync_logs"), 
            ("model3d_uploads", "model3d_uploads"),
            ("3d_models", '"3d_models"'),  # 特殊表名，需要引号
            ("product_images", "product_images"), 
            ("products", "products"), 
            ("categories", "categories")
        ]
        
        # 存储每个表的初始数据量
        initial_counts = {}
        for table_name, table_quoted in tables_to_clear:
            try:
                cursor.execute(f"SELECT COUNT(*) FROM {table_quoted}")
                count = cursor.fetchone()[0]
                initial_counts[table_name] = count
                logger.info(f"{table_name} 表当前记录数: {count}")
            except sqlite3.Error as e:
                logger.warning(f"获取 {table_name} 表数量时出错: {e}")
        
        # 按正确的依赖顺序删除数据
        delete_order = [
            # 首先删除没有外键依赖的表
            "shopify_sync_logs",  # 同步日志
            "production_jobs",    # 生产任务
            "model3d_uploads",    # 3D模型上传记录
            "orders",             # 订单
            "3d_models",          # 3D模型
            "product_images",     # 商品图片
            "products",           # 商品
            "categories"          # 分类
        ]
        
        # 执行删除操作
        delete_results = {}
        for table_name in delete_order:
            try:
                # 获取引用的表名
                table_quoted = next((t[1] for t in tables_to_clear if t[0] == table_name), table_name)
                logger.info(f"开始清空 {table_name} 表数据...")
                cursor.execute(f"DELETE FROM {table_quoted}")
                conn.commit()
                deleted_count = cursor.rowcount
                delete_results[table_name] = deleted_count
                logger.info(f"{table_name} 表数据已清空，删除了 {deleted_count} 条记录")
            except sqlite3.Error as e:
                logger.error(f"清空 {table_name} 表数据时出错: {e}")
                conn.rollback()
        
        # 重新启用外键约束
        cursor.execute("PRAGMA foreign_keys = ON")
        conn.commit()
        logger.info("已重新启用外键约束")
        
        # 验证清理结果
        logger.info("\n=== 清理结果验证 ===")
        all_clear = True
        for table_name, table_quoted in tables_to_clear:
            try:
                cursor.execute(f"SELECT COUNT(*) FROM {table_quoted}")
                count_after = cursor.fetchone()[0]
                logger.info(f"{table_name} 表清理后记录数: {count_after}")
                if count_after > 0:
                    all_clear = False
                    logger.warning(f"⚠️ {table_name} 表数据未完全清空")
            except sqlite3.Error as e:
                logger.error(f"验证 {table_name} 表时出错: {e}")
        
        if all_clear:
            logger.info("\n✅ 所有测试数据已完全清空！")
        else:
            logger.warning("\n⚠️ 部分表数据未完全清空，请检查")
        
        return all_clear
        
    except sqlite3.Error as e:
        logger.error(f"SQLite错误: {e}")
        if 'conn' in locals():
            conn.rollback()
        return False
    except Exception as e:
        logger.error(f"清空数据时出错: {e}")
        return False
    finally:
        # 关闭数据库连接
        if 'conn' in locals():
            conn.close()
            logger.info("数据库连接已关闭")


def check_admin_endpoints():
    """检查管理员端点是否可用"""
    logger.info("\n=== 检查管理员端点状态 ===")
    logger.info("注意：后台可能需要重启以应用数据更改")
    logger.info("请在数据清理后刷新后台页面查看结果")


def restart_server():
    """提示重启服务器以应用更改"""
    logger.info("\n=== 服务器重启提示 ===")
    logger.info("请重启服务器使数据更改完全生效")
    logger.info("可使用 Ctrl+C 停止当前服务器，然后重新启动")


if __name__ == "__main__":
    try:
        logger.info("开始执行清空测试数据脚本...")
        logger.info("此脚本将清理所有测试数据，包括订单、商品、分类、3D模型等")
        
        success = clear_all_test_data()
        check_admin_endpoints()
        restart_server()
        
        if success:
            logger.info("\n脚本执行成功")
            sys.exit(0)
        else:
            logger.error("\n脚本执行失败")
            sys.exit(1)
    except KeyboardInterrupt:
        logger.info("操作被用户中断")
        sys.exit(0)
    except Exception as e:
        logger.error(f"程序执行失败: {e}")
        sys.exit(1)